#include "pid.h"
#include "math.h"
#include "protocol.h"



/**
  * @brief  PID参数初始化
	*	@note 	无
  * @retval 无
  */
void PID_param_init(_pid * pid)
{
		/* 初始化参数 */
//    printf("PID_init begin \n");
    pid->target_val=30.0;				
    pid->actual_val=0.0;
    pid->err=0.0;
    pid->err_last=0.0;
    pid->integral=0.0;
    pid->Kp = 50.0;//24
    pid->Ki = 1.5;
    pid->Kd = 150.0;
    float pid_temp[3] = {pid->Kp, pid->Ki, pid->Kd};
    set_computer_value(SEND_P_I_D_CMD, CURVES_CH1, pid_temp, 3);     // 给通道 1 发送 P I D 值
	uint32_t period = 20;
    set_computer_value(SEND_PERIOD_CMD,CURVES_CH1,&period,1);
	int temp2 = pid->target_val;	
    set_computer_value(SEND_TARGET_CMD, CURVES_CH1, &temp2, 1);                // 给通道 1 发送目标值
}

/**
  * @brief  设置目标值
  * @param  val		目标值
	*	@note 	无
  * @retval 无
  */
void set_pid_target(_pid * pid,float temp_val)
{
  pid->target_val = temp_val;    // 设置当前的目标值
}

/**
  * @brief  获取目标值
  * @param  无
	*	@note 	无
  * @retval 目标值
  */
float get_pid_target(_pid * pid)
{
  return pid->target_val;    // 设置当前的目标值
}

/**
  * @brief  设置比例、积分、微分系数
  * @param  p：比例系数 P
  * @param  i：积分系数 i
  * @param  d：微分系数 d
	*	@note 	无
  * @retval 无
  */
void set_p_i_d(_pid * pid,float p, float i, float d)
{
  	pid->Kp = p;    // 设置比例系数 P
		pid->Ki = i;    // 设置积分系数 I
		pid->Kd = d;    // 设置微分系数 D
}

/**
  * @brief  PID算法实现
  * @param  val		实际值
  * @note 	无
  * @retval 通过PID计算后的输出
  */
float PID_realize(_pid * pid,float temp_val)
{
	/*计算目标值与实际值的误差*/
    pid->err=pid->target_val-temp_val;
	/*误差累积*/
    pid->integral+=pid->err;
  /*积分抗饱和*/
  	if(pid->integral<-1000)pid->integral=-1000;
	  else if(pid->integral>1000)pid->integral=1000;
	/*PID算法实现*/
    pid->actual_val=pid->Kp*pid->err  +  pid->Ki*pid->integral  +  pid->Kd*(pid->err-pid->err_last);
	/*误差传递*/
    pid->err_last=pid->err;
	/*返回当前实际值*/
    return pid->actual_val;
}








